package com.darker.yygh.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.darker.yygh.oss.service.FileService;
import com.darker.yygh.oss.utils.ConstantOssPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

@Service
public class FileServiceimpl implements FileService {
    //oss上传文件
    @Override
    public String upload(MultipartFile file) {

        // Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
        String endpoint = ConstantOssPropertiesUtils.ENDPOINT;

        String accessKeyId = ConstantOssPropertiesUtils.APPKEY;
        String accessKeySecret = ConstantOssPropertiesUtils.SECRET;

        // 填写Bucket名称，例如examplebucket。
        String bucketName = ConstantOssPropertiesUtils.BUCKET;

        // 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。

        String url = null;
        InputStream inputStream = null;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {

            //获取流对象
            inputStream = file.getInputStream();
            //通过uuid生成随机的文件名称 保证文件名唯一 文件不被覆盖
            String uuid = UUID.randomUUID().toString().replace("-","");

            String filename = file.getOriginalFilename();

            filename=uuid+filename;

           //获取当前时间 用当前时间创建文件夹对文件进行时间分类。
            String timeUrl = new DateTime().toString("yyyy/MM/dd");
            //上传的效果 /2022/6/1/uuidFilename.jpg
            filename=timeUrl+filename;
            ossClient.putObject(bucketName, filename, inputStream);
            //拼接出上传后文件的地址 并返回
            url = "https://" + bucketName + "." + endpoint + "/" + filename;
            System.out.println(url);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return url;
    }
}
